package com.kaifamiao.memory;

import com.kaifamiao.object.Panda;

import java.io.*;

public class ByteArrayTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        // 在 JVM 管理的 堆内存 中开辟一块空间用于存放 Panda实例
        Panda p = new Panda( 2002, "大熊", '男' );
        // 不论通过构造传递的数据还是setter设置的数据都将存在于 Panda实例中
        p.setAge((short) 10);
        System.out.printf("%d, %s, %s, %d\n", p.getId(), p.getName(), p.getGender(), p.getAge() );

        // 创建一个 字节数组 输出流 (内部用字节数组缓存数据)
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 创建一个对象输出流 (通过它向底层支持流中写入数据)
        ObjectOutputStream oos = new ObjectOutputStream( baos );
        // 将 Java对象 转换为 字节序列 后再写入到输出流中
        oos.writeObject(p);
        // 关闭输出流
        oos.close();
        baos.close();

        // 即使 字节数组输出流已经被关闭，仍然可以获得其内部数组中存储的数据
        final byte[] bytes = baos.toByteArray();
        System.out.println( bytes.length );

        System.out.println( "- ".repeat(20) );
        // 创建一个 字节数组输入流 (用于读取指定字节数组中的数据)
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        // 创建一个对象输入流
        ObjectInputStream ois = new ObjectInputStream( bais );
        // 从底层支持流中读取字节数据并将其转换为Java对象
        Panda x = (Panda) ois.readObject();
        System.out.printf("%d, %s, %s, %d\n", x.getId(), x.getName(), x.getGender(), x.getAge() );
        // 关闭输入流
        ois.close();
        bais.close();

    }

}
